看懂了后发现 $\texttt{DDP}$ 其实不难呢……
其实主要思想就是将 $\texttt{DP}$ 转移式搞到矩阵上,然后如果是树形 $\texttt{DP}$ 的话就可以直接上树剖或者是 $LCT$ 进行维护,当然还可以用全局平衡二叉树(不费) 。如果只是线性的话可以直接用线段树等数据结构进行维护了。
注意这道模板树剖的复杂度是 $O(nlog^2n)$ ,而 $LCT$ 的复杂度为 $O(nlogn)$ ,于是窝选择了 $LCT$ ,跑的还挺快。
开始分析题目,如果没有”动态”限制的话就是一个裸的”没有上司的舞会”,解法显然是设 $f[u][0/1]$ 表示 $u$ 不选/选 的时候其子树的最大价值,转移显然为:
对于树中的一个节点 $u$ 的所有儿子中有个重儿子,其他的儿子就是轻儿子,我们将重儿子和轻儿子的贡献分开算。设一个 $g[u][0/1]$ ,其值为:
注意上式中的 $v$ 只的是轻儿子,然后 $f$ 的转移就变成了以下形式( $x$ 为重儿子):
其实这里的 $g$ 很好维护,我们在 $Access$ 的时候只要计算儿子变化时的贡献就好了。
接着我们构造出转移矩阵:
这样子就可以直接更新了,对于每个节点我们只需要维护两个矩阵即可,一个就是上面乘法中的 $g$ 矩阵,一个就是上面乘法中的 $f$ 矩阵。
需要注意的是这是广义矩阵乘法,也就是说这个矩阵乘法的运算规则为:
很像 $floyd$ ,可以直接算了。
Code:
1 |
|
本文标题:【题解】【模板】动态DP LCT+DP+矩阵 luoguP4751
文章作者:Qiuly
发布时间:2019年04月19日 - 00:00
最后更新:2019年04月19日 - 19:17
原始链接:http://qiulyblog.github.io/2019/04/19/[题解]luoguP4751/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。